package stream;

import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import java.util.stream.Stream;

/**
 * @author deity
 * @version 1.0
 * @date 2020/11/8 14:58
 * <p>
 * Stream常见API介绍
 * （1）聚合操作
 * <p>
 * (2) Stream的处理流程
 * 数据源
 * 数据转换
 * 获取结果
 * <p>
 * (3) 获取Stream对象
 * (3-1)从集合或者数组中获取
 * Collection.stream()
 * Collection.parallelStream()
 * Arrays.stream(T t)
 * <p>
 * (3-2)BufferReader
 * BufferReader.lines() -> stream()
 * <p>
 * (3-3) 静态工厂
 * java.util.stream.IntStream.range()
 * java.nio.file.Files.walk()
 * <p>
 * (3-4)自定构建
 * java.util.Spliterator
 * <p>
 * (3-5)更多的方式...
 * Random.ints()
 * Pattern.splitAsStream()
 * <p>
 * (4)中间操作API{intermediate}
 * 操作结果是一个Stream,中间操作可以有一个或多个连续的中间操作，需要注意的是，中间操作只记录操作方式，不做具体执行，直到结束操作发生时，才做最终执行。
 * 中间操作: 就是业务逻辑处理
 * <p>
 * 中间操作过程：无状态|有状态
 * 无状态：数据处理时，不受前置中间操作的影响。
 * map/filter/peek/parallel/sequential/unordered
 * 有状态： 数据处理时，受到前置中间操作的影响
 * distinct/sorted/limit/skip
 * <p>
 * (5)终结操作|结束操作{Terminal}
 * 需要注意:一个Stream对象，只能有一个Terminal操作，这个操作一旦发生，就会真实处理数据，生成对应处理
 * 终结操作:非短路操作|短路操作
 * 非短路操作：当前的Stream对象必须处理完集合中所有数据，才能得到处理结果。
 * forEach/forEachOrdered/toArray/reduce/collect/min/max/count/iterator
 * 短路操作：当前的Stream对象在处理过程中，一旦满足某个条件，就可以得到结果
 * anyMatch/allMatch/noneMatch/findFirst/findAny等
 * Short-circuiting,无限大的Stream -> 有限大的Stream
 */
public class StreamApp2 {


    public static void main(String[] args) {

        // 1-批量数据 -> Stream对象
        //多个数据
        Stream stream = Stream.of("admin", "vicky", "celia", "deity");

        //数组
        String[] strArrays = new String[]{"like", "you", "Me"};
        Stream stream2 = Arrays.stream(strArrays);

        //列表
        List<String> list = Arrays.asList("美女", "帅哥", "弟弟");
        Stream stream3 = list.stream();

        //集合
        Set<String> set = new HashSet<>();
        set.add("baba");
        set.add("mama");
        set.add("didi");
        Stream stream4 = set.stream();

        //Map
        Map<String, String> map = new HashMap<>();
        map.put("me", "deity");
        map.put("you", "celia");
        Stream stream5 = map.entrySet().stream();


        // 2-Stream对象对于基本数据类型的功能封装
        // int / long / double
        IntStream.of(new int[]{10, 20, 30}).forEach(System.out::println);
        IntStream.range(1, 5).forEach(System.out::println);
        IntStream.rangeClosed(1, 5).forEach(System.out::println);



        // 3-Stream对象 --> 转换得到指定的数据类型
        //数组
        Object[] objx = stream.toArray(String[]::new);
        System.out.println(objx);

        //字符串
        String str = stream2.collect(Collectors.joining()).toString();
        System.out.println(str);

        //列表
        List<String> listx = (List<String>) stream3.collect(Collectors.toList());
        System.out.println(listx);

        //集合
        Set<String> setx = (Set<String>) stream4.collect(Collectors.toSet());
        System.out.println(setx);

        //Map
        Map<String,String> mapx = (Map<String, String>) stream5.collect(Collectors.toMap(x->x, y->"value:"+y));
        System.out.println(mapx);
    }

}
